package com.gome.ocean.dao.websql;

import java.sql.SQLException;
import java.sql.SQLSyntaxErrorException;
import java.util.List;
import java.util.Map;

import org.springframework.dao.DataAccessException;

import com.gome.ocean.dao.model.dsm.CommonDataBaseDetail;
import com.gome.ocean.dao.model.websql.DataBaseVO;
import com.gome.ocean.dao.model.websql.SqlTemplateVo;
import com.gome.ocean.dao.model.websql.TableVO;

/**
 * Created by liuqingxia on 2016/5/26.<br>
 * webSql的sql执行引擎
 */
public interface WebSqlEngine {

    public Object select(CommonDataBaseDetail commonDataBaseDetail, String dbName, String sql, Integer pageNum,
                         Integer pageSize) throws DataAccessException, SQLSyntaxErrorException;

    public Object select(CommonDataBaseDetail commonDataBaseDetail, String dbName,
                         String sql) throws DataAccessException, SQLSyntaxErrorException;

    public List<DataBaseVO> getDataBase(CommonDataBaseDetail dataBaseDetail) throws SQLException;

    /**
     * 根据类型获取数据库中表信息
     * 
     * @param dataBaseDetail 数据源
     * @param dbName 库名称
     * @param 查询类型 字符串数组 types :"TABLE","VIEW"
     */
    public List<TableVO> getTable(CommonDataBaseDetail dataBaseDetail, String dbName,
                                  String[] types) throws SQLException;

    /**
     * 根据匹配字段值模糊查询表
     * 
     * @param types :"TABLE" 固定值
     */
    public List<TableVO> getLikeTable(CommonDataBaseDetail dataBaseDetail, String dbName, String likeTableName,
                                      String[] types) throws SQLException;

    public List<TableVO> getTableColumnAndIndex(CommonDataBaseDetail dataBaseDetail, String dbName,
                                                String tableName) throws SQLException;

    public List<TableVO> getTableColumnDetail(CommonDataBaseDetail dataBaseDetail, String dbName,
                                              String tableName) throws SQLException;

    public List<TableVO> getTableIndexDetail(CommonDataBaseDetail dataBaseDetail, String dbName,
                                             String tableName) throws SQLException;

    public Map<String, Object> getAutoCompleteTableColumns(CommonDataBaseDetail dataBaseDetail, String dbName,
                                                           String[] types) throws SQLException;

    public Map<String, Object> getDataBaseInfo(CommonDataBaseDetail dataBaseDetail) throws SQLException;

    public List<String> splitSQL(String sqlText) throws SQLException;

    public Object execute(CommonDataBaseDetail dataBaseDetail, String dbName, String sql) throws SQLException;

    public Object getSqlPlan(CommonDataBaseDetail dataBaseDetail, String dbName, String sql) throws SQLException;

    /**
     * @description 索引中引入外键 获取 表的列信息结构
     * @param dataBaseDetail : 数据源 信息
     * @param dbName >: 数据库名称
     * @param tableName >: 数据表名称
     * @return Map<String,Object> map
     */
    public Map<String, Object> showTableAllColumns(CommonDataBaseDetail dataBaseDetail, String dbName,
                                                   String tableName) throws SQLException;

    /**
     * 获取表详细结构数据
     * 
     * @param dataBaseDetail : 数据源 信息
     * @param dbName >: 数据库名称
     * @param tableName >: 数据表名称
     * @param isShowCreate 是否显示创建表语句
     * @param isShowIndex 是否显示索引
     * @param isShowRef 是否显示外键
     * @param isShowDrop 是否在创建表语句前面 显示drop语句
     * @param isShowTruncate 是否在索引前面显示truncate 语句
     * @return Map<String,Object> map
     */
    public Map<String, Object> getTableStructer(CommonDataBaseDetail dataBaseDetail, String dbName, String tableName,
                                                boolean isShowCreate, boolean isShowIndex, boolean isShowRef,
                                                boolean isShowDrop, boolean isShowTruncate) throws SQLException;

    /**
     * 校验数据源接口
     */
    public Map<String, Object> vaildateDatasourceByTddlInfo(String globaConfStr, String appConfStr,
                                                            String dbPwd) throws SQLException;

    /**
     * 根据库、视图名查询出 视图定义的内容
     * 
     * @param dataBaseDetail:数据源
     * @param dbName : 数据库名或者用户名
     * @param viewName:当前视图表名称
     */
    public Map<String, Object> getViewContent(CommonDataBaseDetail dataBaseDetail, String dbName,
                                              String viewName) throws SQLException;

    /**
     * 根据表名称获取某一列详细信息
     * 
     * @param dataBaseDetail 数据源
     * @param dbName 数据库名
     * @param tableName 表名称
     * @param columnName 列名称
     */
    public Map<String, Object> getOneColumnDetailInfo(CommonDataBaseDetail dataBaseDetail, String dbName,
                                                      String tableName, String columnName) throws SQLException;

    /**
     * 根据索引名获取某一列中详细的索引信息
     * 
     * @param dataBaseDetail 数据源
     * @param dbName 数据库名
     * @param tableName 表名称
     * @param indexName 索引名称
     */
    public Map<String, Object> getOneIndexDetailInfo(CommonDataBaseDetail dataBaseDetail, String dbName,
                                                     String tableName, String indexName) throws SQLException;

    /**
     * 根据库名查询出 当前库持有的 数据库存储过程、函数、触发器、事件的信息。
     * 
     * @param dataBaseDetail 数据源
     * @param dbName 库名
     */
    public SqlTemplateVo getAllProcedureFunTrigEventInfo(CommonDataBaseDetail dataBaseDetail, String dbName,
                                                         boolean isProcedurce, boolean isFun, boolean isTrigger,
                                                         boolean isEvent) throws SQLException;

    /**
     * 获取存储过程、函数内容信息
     * 
     * @param dataBaseDetail 数据源
     * @param dbName 库名
     * @param objName 存储过程或者函数名称
     * @param objType 类型 PROCEDURE/TRIGGER
     */
    public Map<String, Object> getProcedureFuncTrigEventDetailInfo(CommonDataBaseDetail dataBaseDetail, String dbName,
                                                                   String objName, String objType) throws SQLException;
}
